home *** CD-ROM | disk | FTP | other *** search
/ Amiga Games Extra 1996 September / Amiga Games Extra CD-ROM 9-1996.iso / userbox / publicdomain / typeface / source / typeface.h < prev   
C/C++ Source or Header  |  1996-05-04  |  12KB  |  411 lines

  1. #include <stdarg.h>
  2. #include <string.h>
  3.  
  4. #include <proto/alib.h>
  5. #include <proto/asl.h>
  6. #include <proto/bgui.h>
  7. #include <proto/diskfont.h>
  8. #include <proto/dos.h>
  9. #include <proto/exec.h>
  10. #include <proto/graphics.h>
  11. #include <proto/intuition.h>
  12. #include <proto/iffparse.h>
  13. #include <proto/utility.h>
  14. #include <clib/textfield_protos.h>
  15.  
  16. #include <exec/exec.h>
  17. #include <gadgets/textfield.h>
  18. #include <graphics/gfxbase.h>
  19. #include <graphics/gfxmacros.h>
  20. #include <graphics/videocontrol.h>
  21. #include <intuition/icclass.h>
  22. #include <intuition/intuitionbase.h>
  23. #include <libraries/bgui_macros.h>
  24.  
  25. #include "locale.h"
  26.  
  27. #define MenuTitle(i)\
  28.   { NM_TITLE, NULL, NULL, 0, 0, (APTR)i }
  29.  
  30. #define PROJECT_MENU \
  31.   MenuTitle(ID_PROJECTMENU), \
  32.     Item(NULL,"O",ID_OPEN), \
  33.     Item(NULL,"S",ID_SAVE), \
  34.     Item(NULL,"D",ID_CHANGEDIR), \
  35.     Item(NULL,"I",ID_PREVIEW), \
  36.     ItemBar, \
  37.     Item(NULL,"P",ID_PREFS), \
  38.     Item(NULL,"?",ID_ABOUT), \
  39.     ItemBar, \
  40.     Item(NULL,"Q",ID_QUIT)
  41. #define FONT_MENU \
  42.   MenuTitle(ID_FONTMENU), \
  43.     Item(NULL,"E",ID_EDITFONT), \
  44.     Item(NULL,NULL,ID_EDITCHAR), \
  45.     ItemBar, \
  46.     Item(NULL,NULL,ID_MOVEFL), \
  47.     Item(NULL,NULL,ID_MOVEFR), \
  48.     Item(NULL,NULL,ID_MOVEFU), \
  49.     Item(NULL,NULL,ID_MOVEFD), \
  50.     ItemBar, \
  51.     Item(NULL,"R",ID_RESETKERN), \
  52.     ItemBar, \
  53.     Item(NULL,"A",ID_CASCADE)
  54. #define CHARACTER_MENU \
  55.   MenuTitle(ID_CHARMENU), \
  56.     Item(NULL,"Z",ID_UNDO), \
  57.     Item(NULL,"X",ID_CUT), \
  58.     Item(NULL,"C",ID_COPY), \
  59.     Item(NULL,"V",ID_PASTE), \
  60.     Item(NULL,NULL,ID_ERASE), \
  61.     ItemBar, \
  62.     Item(NULL,NULL,ID_MOVEL), \
  63.     Item(NULL,NULL,ID_MOVER), \
  64.     Item(NULL,NULL,ID_MOVEU), \
  65.     Item(NULL,NULL,ID_MOVED), \
  66.     ItemBar, \
  67.     Item(NULL,NULL,ID_FLIPH), \
  68.     Item(NULL,NULL,ID_FLIPV), \
  69.     ItemBar, \
  70.     Item(NULL,NULL,ID_ZOOMIN), \
  71.     Item(NULL,NULL,ID_ZOOMOUT), \
  72.     ItemBar, \
  73.     Item(NULL,"W",ID_WIDTHC), \
  74.     Item(NULL,"K",ID_KERNING)
  75. #define PREVIEW_MENU \
  76.   MenuTitle(ID_PREVIEWMENU), \
  77.     Item(NULL,"T",ID_UPDATE), \
  78.     Item(NULL,"H",ID_ALL), \
  79.     Item(NULL,"L",ID_CLEAR)
  80.  
  81. #define NAME "Typeface"
  82. #define VERSION "1.2"
  83. #define CURRENT_PREFS 2
  84.  
  85. #define MAX(a,b) (((a) > (b)) ? (a) : (b))
  86. #define MIN(a,b) (((a) < (b)) ? (a) : (b))
  87.  
  88. struct Character
  89. {
  90.   UWORD chr_Width,chr_Height;
  91.   UBYTE *chr_Data;
  92. };
  93.  
  94. struct Preferences
  95. {
  96.   UWORD Version;
  97.   ULONG Flags, ScrModeID, ScrDepth;
  98.   ULONG VecHeight, PixelX, PixelY;
  99.   ULONG SaveTo;
  100.   UBYTE ScrFontName[MAXFONTNAME];
  101.   UWORD ScrFontHeight;
  102.   UBYTE ThisPubName[MAXPUBSCREENNAME], DefPubName[MAXPUBSCREENNAME];
  103.   UWORD ToolBar;
  104.   UBYTE CharSize,CharWidth;
  105.   UWORD CharHeight;
  106.   UBYTE FixedFontName[MAXFONTNAME];
  107.   UWORD FixedFontHeight;
  108. };
  109.  
  110. #define PREFS_CUSTOMSCREEN    (1<<0)
  111. #define PREFS_PIXELBORDER    (1<<1)
  112. #define PREFS_PIXELGRID        (1<<2)
  113. #define PREFS_MAXWINDOW        (1<<3)
  114. #define PREFS_CONFIRMQUIT    (1<<4)
  115. #define PREFS_SHOWBASELINE    (1<<5)
  116. #define PREFS_AUTOTBARHEIGHT    (1<<6)
  117. #define PREFS_INVERTSHIFT    (1<<7)
  118. #define PREFS_NOTOGGLE        (1<<8)
  119. #define PREFS_QUERYWIDTH    (1<<9)
  120.  
  121. #define TBAR_WIDTHL        0
  122. #define FTBAR_WIDTHL        (1<<(TBAR_WIDTHL))
  123. #define TBAR_WIDTHR        1
  124. #define FTBAR_WIDTHR        (1<<(TBAR_WIDTHR))
  125. #define TBAR_MOVEL        2
  126. #define FTBAR_MOVEL        (1<<(TBAR_MOVEL))
  127. #define TBAR_MOVER        3
  128. #define FTBAR_MOVER        (1<<(TBAR_MOVER))
  129. #define TBAR_MOVEU        4
  130. #define FTBAR_MOVEU        (1<<(TBAR_MOVEU))
  131. #define TBAR_MOVED        5
  132. #define FTBAR_MOVED        (1<<(TBAR_MOVED))
  133. #define TBAR_KERN        6
  134. #define FTBAR_KERN        (1<<(TBAR_KERN))
  135. #define TBAR_WIDTH        7
  136. #define FTBAR_WIDTH        (1<<(TBAR_WIDTH))
  137. #define TBAR_ZOOMIN        8
  138. #define FTBAR_ZOOMIN        (1<<(TBAR_ZOOMIN))
  139. #define TBAR_ZOOMOUT        9
  140. #define FTBAR_ZOOMOUT        (1<<(TBAR_ZOOMOUT))
  141. #define TBAR_FLIPH        10
  142. #define FTBAR_FLIPH        (1<<(TBAR_FLIPH))
  143. #define TBAR_FLIPV        11
  144. #define FTBAR_FLIPV        (1<<(TBAR_FLIPV))
  145.  
  146. #define DEFAULT_TBAR \
  147.   FTBAR_WIDTHL|FTBAR_WIDTHR|FTBAR_MOVEL| \
  148.   FTBAR_MOVER|FTBAR_MOVEU|FTBAR_MOVED|FTBAR_KERN
  149.  
  150. /* typeface.c */
  151.  
  152. enum id { ID_OPEN = 1,        ID_SAVE,        ID_CHANGEDIR,
  153.       ID_EDITFONT,        ID_PREFS,        ID_ABOUT,
  154.       ID_QUIT,        ID_CHARS,        ID_CHARSCROLL,
  155.       ID_EDIT,        ID_WIDTHL,        ID_WIDTHR,
  156.       ID_WIDTHC,        ID_MOVEL,        ID_MOVER,
  157.       ID_MOVEU,        ID_MOVED,        ID_KERNING,
  158.       ID_COPY,        ID_PASTE,        ID_ACCEPT,
  159.       ID_CANCEL,        ID_PROPORTIONAL,    ID_HEIGHT,
  160.       ID_WIDTH,        ID_BASELINE,        ID_SMEAR,
  161.       ID_NORMAL,        ID_BOLD,        ID_ITALIC,
  162.       ID_ULINE,        ID_EXTEND,        ID_REVERSE,
  163.       ID_ASPECT,        ID_VECHEIGHT,        ID_PIXELWIDTH,
  164.       ID_PIXELHEIGHT,    ID_PIXELBORDER,        ID_ASSIGNSTR,
  165.       ID_ASSIGNPATH,    ID_ASSIGN,        ID_ASSIGNADD,
  166.       ID_CHARWIDTH,        ID_WIDTHPOS,        ID_SPACE,
  167.       ID_KERN,        ID_CUSTOM,        ID_CHOOSEMODE,
  168.       ID_CHOOSEFONT,    ID_SAVETO,        ID_USE,
  169.       ID_FONTNAME,        ID_GETSAVEDIR,        ID_FIRST,
  170.       ID_LAST,        ID_KERNTABLE,        ID_SAVEDIR,
  171.       ID_BLANK,        ID_PUBNAME,        ID_RESETKERN,
  172.       ID_MOVEFL,        ID_MOVEFR,        ID_MOVEFU,
  173.       ID_MOVEFD,        ID_CHARSIZE,        ID_CHARWIDE,
  174.       ID_CHARHIGH,        ID_CHOOSEFIXFONT,    ID_MAXWIN,
  175.       ID_CONFIRMQUIT,    ID_SHOWBASELINE,    ID_AUTOHEIGHT,
  176.       ID_INVERTSHIFT,    ID_PREVIEW,        ID_ALL,
  177.       ID_PREVIEWSTR,    ID_CLEAR,        ID_UPDATE,
  178.       ID_PREVIEWSCROLL,    ID_ZOOMIN,        ID_ZOOMOUT,
  179.       ID_PROJECTMENU,    ID_FONTMENU,        ID_CHARMENU,
  180.       ID_PREVIEWMENU,    ID_UNDO,        ID_CUT,
  181.       ID_ERASE,        ID_FLIPH,        ID_FLIPV,
  182.       ID_TOGGLE,        ID_CASCADE,        ID_EDITCHAR,
  183.       ID_EDITCHARNUM,    ID_QUERYWIDTH,        ID_QUERYWIDTHNUM };
  184.  
  185. enum scroll { GADG_HORIZ,
  186.           GADG_VERT,
  187.           GADG_LEFT,
  188.           GADG_RIGHT,
  189.           GADG_UP,
  190.           GADG_DOWN,
  191.           GADG_NONE };
  192.  
  193. #define GETBIT(buffer,offset) \
  194.   ((((*((UBYTE *)(buffer)+((offset)>>3)))&(128>>((offset)&7))) != 0) \
  195.   ? 1 : 0)
  196.  
  197. struct charDef
  198. {
  199.   WORD charOffset,charBitWidth;
  200. };
  201.  
  202. void Setup(void);
  203. void SetupScreen(void);
  204. __geta4 ULONG WindowHook(__a0 struct Hook *hook, __a2 Object *o,
  205.   __a1 struct IntuiMessage *msg);
  206. void OpenFontWnd(void);
  207. void CloseFontWnd(void);
  208. void Quit(void);
  209. void QuitScreen(void);
  210. void MsgLoop(void);
  211. ULONG CheckObjMsg(struct Window *wnd, Object *obj);
  212. void CheckOpenCharWin(ULONG pressed, ULONG shift);
  213. void SharedMsgs(ULONG code,struct CharNode *node);
  214. void LoadChosenFont(void);
  215. void Error(char *message);
  216. LONG ShowReq(char *text,char *gadgets,...);
  217. void ClrDisposeObject(Object **obj);
  218. void ClrWindowClose(Object **obj,struct Window **wnd);
  219. void SleepWindows(void);
  220. void WakeWindows(void);
  221. BOOL UnpackChar(struct Character *chr,struct TextFont *font,ULONG i);
  222. void KernTables(ULONG to, ULONG from);
  223. void ClearCurrentFont(void);
  224. void OpenEditFontWnd(void);
  225. void CloseEditFontWnd(BOOL obj);
  226. __geta4 LONG TBCompareFunc(__a0 struct Hook *hook, __a2 Object *o,
  227.   __a1 struct lvCompare *lvc);
  228. __geta4 LONG TBResourceFunc(__a0 struct Hook *hook, __a2 Object *o,
  229.   __a1 struct lvResource *lvr);
  230. __geta4 char *TBDisplayFunc(__a0 struct Hook *hook, __a2 Object *o,
  231.   __a1 struct lvRender *lvr);
  232. void OpenPrefsWnd(void);
  233. void ClosePrefsWnd(BOOL obj);
  234. void OpenAssignWnd(void);
  235. void CloseAssignWnd(BOOL obj);
  236. void OpenEditCharWnd(void);
  237. void CloseEditCharWnd(BOOL obj);
  238. void OpenWidthWnd(struct CharNode *node);
  239. void CloseWidthWnd(BOOL obj);
  240. void OpenKernWnd(struct CharNode *node);
  241. void CloseKernWnd(BOOL obj);
  242. void OpenSaveWnd(void);
  243. void CloseSaveWnd(void);
  244. void OpenAboutWnd(void);
  245. void PutPositive(struct Window *wnd,char *name,LONG value,LONG min,
  246.   LONG *dest);
  247. void NewHeights(void);
  248. void NewWidths(void);
  249. void ChangeCharWidth(struct Character *chr, ULONG width, ULONG newoffset,
  250.   ULONG oldoffset);
  251. void CheckWidthKern(struct Character *chr);
  252. void SavePrefs(char *filename);
  253. void LoadPrefs(void);
  254. void FlushAllFonts(void);
  255. void GetScreenRatio(struct Screen *scr);
  256. void WriteFont(char *buffer, char *name, UWORD height);
  257. char *GetPubName(BOOL screen);
  258. void CopyPubName(void);
  259. void WarnVisitors(void);
  260. LONG SizeX(LONG x);
  261. LONG SizeY(LONG y);
  262. void CheckQuit(void);
  263. void AddToolBarList(UWORD entry);
  264. void CascadeWindows();
  265.  
  266. /* char.c */
  267.  
  268. #define DATA(i,j) *(chr->chr_Data+((j)*chr->chr_Width)+(i))
  269.  
  270. struct CharNode
  271. {
  272.   struct Node chln_Node;
  273.   Object *chln_Object;
  274.   struct Window *chln_Window;
  275.   char *chln_Title;
  276.   Object *chln_HorizGadg, *chln_VertGadg;
  277.   Object *chln_LeftGadg, *chln_RightGadg;
  278.   Object *chln_UpGadg, *chln_DownGadg;
  279.   struct Hook *chln_Hook;
  280.   Object *chln_EditGadg;
  281.   struct Character *chln_Character;
  282.   ULONG chln_Number;
  283.   ULONG chln_MinPixelX, chln_MinPixelY;
  284.   ULONG chln_CurPixelX, chln_CurPixelY;
  285.   ULONG chln_ToolBarWidth, chln_ToolBarHeight;
  286.   struct Character chln_UndoChar;
  287.   Object *chln_ToolBar, *chln_WinGroup;
  288. };
  289.  
  290. struct CharNode *OpenCharWin(ULONG charnum,struct IBox size);
  291. void CloseCharWin(struct CharNode *node);
  292. Object *CreateSysImage(ULONG which,struct DrawInfo *dri);
  293. Object *CreatePropGadg(ULONG freedom,Tag tag1,...);
  294. Object *CreateButtonGadg(Object *image,Tag tag1,...);
  295. __geta4 void CharHook(__a0 struct Hook *hook, __a2 Object *o,
  296.   __a1 struct IntuiMessage *msg);
  297. void ForceResizeChar(struct CharNode *node);
  298. void SetScrollers(struct CharNode *node);
  299. void RedrawEdit(struct CharNode *node);
  300. void MoveLeft(struct CharNode *node,struct Character *chr);
  301. void MoveRight(struct CharNode *node,struct Character *chr);
  302. void MoveUp(struct CharNode *node,struct Character *chr);
  303. void MoveDown(struct CharNode *node,struct Character *chr);
  304. void MoveAll(void (*MoveFunction)());
  305. void RedrawAll(void);
  306. void ZoomIn(struct CharNode *node);
  307. void ZoomOut(struct CharNode *node);
  308. void SetMinWindowSize(struct CharNode *node, ULONG oldx);
  309. void CopyChar(struct CharNode *node,struct Character *copyto);
  310. void PasteChar(struct CharNode *node,struct Character *pasteto);
  311. void EraseChar(struct CharNode *node);
  312. void SwapBytes(UBYTE *ptr,int i,int j);
  313. void FlipHoriz(struct CharNode *node);
  314. void FlipVert(struct CharNode *node);
  315. void OpenResetKernWnd(void);
  316. void CloseResetKernWnd(BOOL obj);
  317. void ResetKerning(WORD space,WORD kern);
  318.  
  319. /* fontio.c */
  320.  
  321. void OpenPreviewWnd(void);
  322. void ClosePreviewWnd(BOOL all);
  323. void SetPreviewFont();
  324. void PreviewMsgs(ULONG code);
  325. void SetPreviewScroller();
  326. void PreviewAll(void);
  327. UBYTE *SaveFont(BOOL tables,BOOL preview);
  328. ULONG SaveShowReq(char *text,char *gadgets,...);
  329. void WriteCharData(struct charDef *cd, UBYTE *fontdataptr, ULONG dest,
  330.   ULONG src, ULONG *off, ULONG mod);
  331. void OpenQueryWidthWnd(void);
  332. void CloseQueryWidthWnd(void);
  333. BOOL LoadFont(struct TextAttr *font, ULONG width);
  334.  
  335. /* text.c */
  336.  
  337. void SetLabelKey(Object *win, Object *gadg, APTR text);
  338. void SetupMenus(struct NewMenu *menus);
  339.  
  340. /* node.c */
  341.  
  342. struct List *GetNewList(struct List **list);
  343. struct Node *CreateNode(ULONG size,struct List *list);
  344. void RemoveList(struct List **list,BOOL all,HOOKFUNC hook);
  345.  
  346. /* gadget.c */
  347.  
  348. #define CG_TAGBASE    (TAG_USER+1000)
  349. #define CG_Pos        (CG_TAGBASE+0)
  350. #define CG_Pressed    (CG_TAGBASE+1)
  351. #define CG_SizeX    (CG_TAGBASE+2)
  352. #define CG_SizeY    (CG_TAGBASE+3)
  353. #define CG_Redraw    (CG_TAGBASE+4)
  354. #define CG_Font        (CG_TAGBASE+5)
  355. #define CG_ShiftDown    (CG_TAGBASE+6)
  356.  
  357. Class *InitCharGadgClass(void);
  358. BOOL FreeCharGadgClass(Class *cl);
  359. ULONG GetCharGadgWidth(UWORD width,struct TextFont *font);
  360. ULONG GetCharGadgHeight(UWORD height,struct TextFont *font);
  361.  
  362. #define EG_XOFFSET 4
  363. #define EG_YOFFSET 2
  364.  
  365. #define EG_TAGBASE    (TAG_USER+1000)
  366. #define EG_PixelX    (EG_TAGBASE+1)
  367. #define EG_PixelY    (EG_TAGBASE+2)
  368. #define EG_CharStruct    (EG_TAGBASE+3)
  369. #define EG_Update    (EG_TAGBASE+4)
  370. #define EG_Width    (EG_TAGBASE+5)
  371. #define EG_Height    (EG_TAGBASE+6)
  372. #define EG_XOffset    (EG_TAGBASE+7)
  373. #define EG_YOffset    (EG_TAGBASE+8)
  374. #define EG_CharNode    (EG_TAGBASE+9)
  375. #define EG_PixelBorder    (EG_TAGBASE+10)
  376. #define EG_ShowBaseline    (EG_TAGBASE+11)
  377. #define EG_Baseline    (EG_TAGBASE+12)
  378. #define EG_ChangePtr    (EG_TAGBASE+13)
  379. #define EG_Toggle    (EG_TAGBASE+14)
  380.  
  381. Class *InitEditGadgClass(void);
  382. BOOL FreeEditGadgClass(Class *cl);
  383.  
  384. #define SCRL_TAGBASE    (TAG_USER+1000)
  385. #define SCRL_Right    (SCRL_TAGBASE+1)
  386.  
  387. Class *InitSlideGadgClass(void);
  388. BOOL FreeSlideGadgClass(Class *cl);
  389.  
  390. #define FL_AcceptDrop    (TAG_USER+0x2000)
  391. #define FL_SortDrops    (TAG_USER+0x2001)
  392.  
  393. Class *InitFLClass(void);
  394. BOOL FreeFLClass(Class *cl);
  395.  
  396. /* error.c */
  397.  
  398. enum errors { ASLALLOC,
  399.           CREATEPORT,
  400.           LOCKSCREEN,
  401.           OPENSCREEN,
  402.           ALLOCVEC,
  403.           NEWWINDOW,
  404.           NEWFILE,
  405.           OPENWINDOW,
  406.           NEWPROP,
  407.           NEWBUTTON };
  408.  
  409. void ErrorCode(ULONG code);
  410. char *ErrorText(ULONG code);
  411.